/*
 * Copyright (c) 2024, Qi Yaolong.
 * dragon@hbu.edu.cn
 * HeBei University, China.
 * 
 * 简体中文
 * 保留所有权利。除非符合（遵守）以下条款，否则您不得使用此文件：
 * 
 * 禁止任何未经授权的个人或组织以任何形式将本程序及其附属资料、创新、创意、架构设计、算法、衍生作品
 * 等用于任何商业目的、盈利活动、各类竞赛(比赛)、直播教学、录播教学、线下课程、书籍编写、教材编写、
 * 会议、培训、公益活动、项目课题、毕业设计、毕业论文、学术论文等。
 * 
 * 本程序由版权持有人和贡献人“按原样”提供，不提供任何明示或暗示担保，包括但不局限于对适销性和特定
 * 用途适合性的暗示担保。在任何情况下，版权持有人或贡献人对因使用本程序而导致的任何直接、间接、附带、
 * 特殊、典型或后果性损害（包括但不限于购买替代商品或服务；使用损失、数据丢失或利润损失；业务中断）
 * 不承担任何责任，无论其如何产生，也不论其责任理论为何，无论是合同、严格责任还是侵权（包括疏忽或
 * 其他），即使已告知此类损害的可能性。
 * 
 * English
 * All rights reserved. You may NOT use this file except in compliance with the
 * following terms:
 * 
 * IT IS PROHIBITED FOR ANY UNAUTHORIZED PERSON OR ENTITY TO USE THIS PROGRAM AND 
 * ITS ANCILLARY DATA, INNOVATIONS, CONCEPTS, ARCHITECTURE DESIGN, ALGORITHMS, 
 * DERIVED WORKS, ETC., IN ANY FORM FOR COMMERCIAL PURPOSES, PROFIT-MAKING 
 * ACTIVITIES, VARIOUS COMPETITIONS (CONTESTS), LIVE TEACHING, PRE-RECORDED 
 * LESSONS, OFFLINE COURSES, BOOK WRITING, CONFERENCES, TRAININGS, PUBLIC WELFARE 
 * ACTIVITIES, PROJECTS, TOPICS, GRADUATION DESIGNS, DISSERTATIONS, THESES, AND 
 * OTHER APPLICATIONS.
 * 
 * THIS PROGRAM IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS PROGRAM, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// 核心板三色灯PWM控制
// 注意：GPIO9引脚可以正常输出PWM信号，GPIO5引脚无法正常输出PWM信号
// 需要将GPIO9引脚和GPIO5引脚短接，使用GPIO9引脚控制RGB三色灯

#include <stdio.h>     
#include <stdlib.h>    
#include "ohos_init.h" 
#include "cmsis_os2.h" 
#include "pwm.h"

#define PWM_FUNC 1 
#define RGB_GPIO 9 
#define RGB_PWM 1  

pwm_config_t cfg_code0 = {14,     
                          2,      
                          0,      
                          0,      
                          false}; 

pwm_config_t cfg_code1 = {14,     
                          4,      
                          0,      
                          0,      
                          false}; 

volatile int g_warning_flag = 0;

static void one_num(void)
{
    uapi_pwm_open(RGB_PWM, &cfg_code1);

    uapi_pwm_set_group(RGB_PWM, 1 << RGB_PWM); 

    uapi_pwm_start(RGB_PWM); 

    uapi_pwm_close(RGB_PWM);
    uapi_tcxo_delay_us(1);
}

static void zero_num(void)
{
    uapi_pwm_open(RGB_PWM, &cfg_code0);
    uapi_pwm_set_group(RGB_PWM, 1 << RGB_PWM);
    uapi_pwm_start(RGB_PWM);
    uapi_pwm_close(RGB_PWM);
    uapi_tcxo_delay_us(1);
}

static void red_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
}

static void green_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
}

static void blue_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
}

static void cyan_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
}

static void magenta_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
}

static void yellow_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
}

static void white_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
}

static void close_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
}

void set_warning_flag(int flag)
{
    g_warning_flag = flag;
    if (g_warning_flag == 0)
    {
        osDelay(10); 
        close_led(); 
    }
}

int get_warning_flag(void)
{
    return g_warning_flag;
}

static void BoardRgbTask(void *arg)
{
    (void)arg;

    uapi_pin_set_mode(RGB_GPIO, PWM_FUNC); 
    uapi_pwm_init();                       

    while (1)
    {
        
        while (g_warning_flag)
        {
            if (g_warning_flag) 
                red_led();      
            osDelay(10);        
            if (g_warning_flag) 
                green_led();    
            osDelay(10);        
            if (g_warning_flag) 
                blue_led();     
            osDelay(10);        
        }
        osDelay(10); 
    }
}

void BoardRgbEntry(void)
{
    
    osThreadAttr_t attr;
    attr.name = "BoardRgbTask";
    attr.stack_size = 1024 * 1;
    attr.priority = osPriorityNormal;

    if (osThreadNew(BoardRgbTask, NULL, &attr) == NULL)
    {
        printf("[BoardRgbEntry] Falied to create BoardRgbTask!\n");
    }
}
